//package com.plian.system.controller.fr.bank;
//
//
//import com.alibaba.fastjson.JSON;
//import com.auth0.jwt.JWT;
//import com.auth0.jwt.JWTVerifier;
//import com.auth0.jwt.algorithms.Algorithm;
//import com.auth0.jwt.exceptions.JWTDecodeException;
//import com.auth0.jwt.exceptions.JWTVerificationException;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.plian.Tools.*;
//import com.plian.Tools.pagedata.PageData;
//import com.plian.system.common.status.CustomCode;
//import com.plian.system.config.AppKeySign;
//import com.plian.system.constant.baseinfo.ValueSetConstant;
//import com.plian.system.constant.sys.FormTypeConstant;
//import com.plian.system.dao.bt.baseinfo.BaseInfoDao;
//import com.plian.system.dao.sys.per.UserOrgDao;
//import com.plian.system.dao.sys.user.UserDao;
//import com.plian.system.entity.fr.bank.*;
//import com.plian.system.model.CommonCode;
//import com.plian.system.model.ObjResult;
//import com.plian.system.model.R;
//import com.plian.system.model.token.PassToken;
//import com.plian.system.properties.GzwProperties;
//import com.plian.system.service.bt.baseinfo.BaseInfoService;
//import com.plian.system.service.fr.bank.*;
//import com.plian.system.service.sys.orgzation.OrgzationService;
//import com.plian.system.service.sys.user.UserService;
//import com.plian.system.vo.fr.bank.AppSignVO;
//import io.swagger.annotations.Api;
//import lombok.AllArgsConstructor;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.web.bind.annotation.*;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.*;
//
//
///**
// *
// * 资金取数 对外接口
// *
// * @author gangan
// * @since 2020-07-10
// */
//@RestController
//@RequestMapping("api/bank")
//@AllArgsConstructor
//@Api(value = "数据（对接第三方）", tags = "数据（对接第三方）")
//public class BankController {
//
//
//    private static final Logger log = LoggerFactory.getLogger(BankController.class);
//
//    private IBankAccountInfoService bankAccountInfoService;
//
//    private IBankTradeDetailService bankTradeDetailService;
//
//    private IBankDepositService bankDepositService;
//
//    private IBankCurrentHistoryService bankCurrentHistoryService;
//
//    private OrgzationService orgzationService;
//
//    private BaseInfoService baseInfoService;
//
//    private IBankKeyService bankKeyService;
//
//    private IBankDepositRecordService bankDepositRecordService;
//
//    private UserService userService;
//
//    private BaseInfoDao baseInfoDao;
//
//    private UserDao userDao;
//
//    private IBankRecordService bankRecordService;
//
//    private final static String OTHER_BANK_CODE = "114051";
//
//    private UserOrgDao userOrgDao;
//
//    private GzwProperties gzwProperties;
//
//
//    /**
//     * 时间差最小值
//     */
//    private final static Integer SECOND_MIN = 0;
//
//    /**
//     * 时间差最大值
//     */
//    private final static Integer SECOND_MAX = 10;
//
//
//    /**
//     * 保存接口
//     * @param appSignVO
//     * @return
//     * @throws Exception
//     */
//    @PostMapping(value = "/saveBankInfo")
//    @PassToken
//    @AppKeySign
//    public R saveBankInfo(@RequestBody AppSignVO appSignVO){
//
//        log.debug(appSignVO.getToken());
//
//        log.debug(appSignVO.getInfo());
//
//        //根据appId获得加密密码
//        String appId = appSignVO.getAppId();
//        BankKey bankKey = bankKeyService.getOne(Wrappers.<BankKey>lambdaQuery().eq(BankKey::getAppId, appId));
//        String key = bankKey.getBankKey();
//
//        log.info("saveBankInfo----->info：" + appSignVO.getInfo());
//        if (StringUtil.isBlank(appSignVO.getInfo())){
//            return R.fail("info 为空");
//        }
//        //解密
//        String json = EncryptUtil.decryptBase64(appSignVO.getInfo(), key);
//        log.info("saveBankInfo----->json：" + json);
//        Integer type = appSignVO.getType();
//        //值级
//        Map<String, Map<String, String>> refs = initRef();
//        //币种
//        Map<String, String> currentRef = refs.get("currentRef");
//
//        Map<String, String> orgIdNameMap = refs.get("orgIdNameMap");
//        Map<String, String> orgNameIdMap = refs.get("orgNameIdMap");
//        Map<String, String> orgNameCodeMap = refs.get("orgNameCodeMap");
//        Map<String, String> orgCodeIdMap = refs.get("orgCodeIdMap");
//
//        Map<String, String> bankMap = refs.get("bankMap");
//        Map<String, String> bankNameMap = refs.get("bankNameMap");
//        Map<String, String> bankNameCodeMap = refs.get("bankNameCodeMap");
//        Set<String> bankNameList = bankNameCodeMap.keySet();
//
//        try {
//            switch (type){
//                case 1:
//                    //账户信息
//                    List<BankAccountInfo> accountInfos = JSON.parseArray(json, BankAccountInfo.class);
//                    if (CollectionUtil.isEmpty(accountInfos)){
//                        return new R(CustomCode.builder().message("数据为空").code(1999).success(false).build());
//                    }
//                    bankRecordService.updateCurrentCount(bankKey.getTopGroupId(), bankKey.getTopGroupName(), accountInfos.size());
//
//                    for (BankAccountInfo bankAccountInfo : accountInfos) {
//                        // todo 数据处理
//                        bankAccountInfo.setTopGroupId(bankKey.getTopGroupId());
//                        bankAccountInfo.setTopGroupName(bankKey.getTopGroupName());
//                        if (currentRef.containsKey(bankAccountInfo.getCurrentCode())){
//                            bankAccountInfo.setCurrentCode(currentRef.get(bankAccountInfo.getCurrentCode()));
//                        }
//
//                        if (bankMap.containsKey(bankAccountInfo.getBankName())){
//                            bankAccountInfo.setBankCode(bankMap.get(bankAccountInfo.getBankName()));
//                            bankAccountInfo.setBankName(bankNameMap.get(bankAccountInfo.getBankName()));
//                            if (OTHER_BANK_CODE.equals(bankAccountInfo.getBankCode())){
//                                String tempBankName = findBankName(bankNameList, bankAccountInfo.getOpenBankName());
//                                if (StringUtil.isNotBlank(tempBankName) && bankNameCodeMap.containsKey(tempBankName)){
//                                    bankAccountInfo.setBankName(tempBankName);
//                                    bankAccountInfo.setBankCode(bankNameCodeMap.get(tempBankName));
//                                }
//                            }
//                        }
//                        String accountName=bankAccountInfo.getBankAccountName();
//                        if(accountName!=null){
//                            accountName=accountName.replaceAll("本部","");
//                        }
//                        if (orgNameIdMap.containsKey(accountName)){
//                            bankAccountInfo.setOrgName(accountName);
//                            bankAccountInfo.setOrgId(orgNameIdMap.get(accountName));
//                        }
//                        if (Optional.ofNullable(bankAccountInfo.getAccountStatus()).isPresent()) {
//                            if (bankAccountInfo.getAccountStatus() != 1 && bankAccountInfo.getAccountStatus() != 2
//                                    && bankAccountInfo.getAccountStatus() != 3 && bankAccountInfo.getAccountStatus() != 4) {
//                                bankAccountInfo.setAccountStatus(1);
//                            }
//                        } else {
//                            bankAccountInfo.setAccountStatus(1);
//                        }
//                        QueryWrapper<BankAccountInfo> queryWrapper = new QueryWrapper<>();
//                        queryWrapper.eq("bank_account", bankAccountInfo.getBankAccount());
//                        /*if (StringUtil.isBlank(bankAccountInfo.getBankName())){
//                            queryWrapper.isNull("bank_name");
//                        }else {
//                            queryWrapper.eq("bank_name", bankAccountInfo.getBankName());
//                        }*/
//                        BankAccountInfo old = bankAccountInfoService.getOne(queryWrapper);
//                        if (Optional.ofNullable(old).isPresent()){
//                            bankAccountInfo.setId(old.getId());
//                            if (OTHER_BANK_CODE.equals(bankAccountInfo.getBankCode()) &&
//                                    !OTHER_BANK_CODE.equals(old.getBankCode())){
//                                bankAccountInfo.setBankCode(old.getBankCode());
//                                bankAccountInfo.setBankName(old.getBankName());
//                            }
//                        }
//                        bankAccountInfo.setAddType("1");
//                        bankAccountInfo.setFormType(String.valueOf(FormTypeConstant.FR_BANK_ACCOUNT));
//                        bankAccountInfoService.saveOrUpdate(bankAccountInfo);
//                    }
//                    break;
//                case 2:
//                    // 定期账户信息
//                    List<BankDeposit> bankDeposits = JSON.parseArray(json, BankDeposit.class);
//                    if (CollectionUtil.isEmpty(bankDeposits)){
//                        return new R(CustomCode.builder().message("数据为空").code(1999).success(false).build());
//                    }
//
//                    for (BankDeposit bankDeposit : bankDeposits) {
//                        // todo 数据处理
//                        if (bankMap.containsKey(bankDeposit.getBankName())){
//                            bankDeposit.setBankCode(bankMap.get(bankDeposit.getBankName()));
//                            bankDeposit.setBankName(bankNameMap.get(bankDeposit.getBankName()));
//                            if (OTHER_BANK_CODE.equals(bankDeposit.getBankCode())){
//                                String tempBankName = findBankName(bankNameList, bankDeposit.getOpenBankName());
//                                if (StringUtil.isNotBlank(tempBankName) && bankNameCodeMap.containsKey(tempBankName)){
//                                    bankDeposit.setBankName(tempBankName);
//                                    bankDeposit.setBankCode(bankNameCodeMap.get(tempBankName));
//                                }
//                            }
//                        }
//                        bankDeposit.setInitialDepositAmount(bankDeposit.getDepositAmount());
//                        BankDeposit old = bankDepositService.getOne(new QueryWrapper<BankDeposit>()
//                                .eq("bank_account", bankDeposit.getBankAccount()));
//                        if (Optional.ofNullable(old).isPresent()){
//                            bankDeposit.setId(old.getId());
//                            if (old.getDepositAmount().compareTo(bankDeposit.getDepositAmount()) != 0){
//                                BankDepositRecord bankDepositRecord = new BankDepositRecord();
//                                bankDepositRecord.setTakeOutAmount(BigDecimalUtil.subtract(old.getDepositAmount(), bankDeposit.getDepositAmount()));
//                                bankDepositRecord.setDepositAmount(bankDeposit.getDepositAmount());
//                                bankDepositRecordService.saveOrUpdate(bankDepositRecord);
//                            }
//                        }
//                        String accountName=bankDeposit.getBankAccountName();
//                        if(accountName!=null){
//                            accountName=accountName.replaceAll("本部","");
//                        }
//                        if (orgNameIdMap.containsKey(accountName)){
//                            bankDeposit.setOrgName(accountName);
//                            bankDeposit.setOrgId(orgNameIdMap.get(accountName));
//                        }
//
//                        bankDeposit.setTopGroupId(bankKey.getTopGroupId());
//                        bankDeposit.setTopGroupName(bankKey.getTopGroupName());
//                        bankDeposit.setFormType(String.valueOf(FormTypeConstant.FR_BANK_DEPOSIT));
//                        bankDepositService.saveOrUpdate(bankDeposit);
//                    }
//                    break;
//                case 3:
//                    //资金交易明细
//                    List<BankTradeDetail> bankTradeDetails = JSON.parseArray(json, BankTradeDetail.class);
//                    if (CollectionUtil.isEmpty(bankTradeDetails)){
//                        return new R(CustomCode.builder().message("数据为空").code(1999).success(false).build());
//                    }
//                    bankRecordService.updateDetailCount(bankKey.getTopGroupId(), bankKey.getTopGroupName(), bankTradeDetails.size());
//
//                    for (BankTradeDetail bankTradeDetail : bankTradeDetails){
//                        // todo 数据处理
//                        bankTradeDetail.setTopGroupId(bankKey.getTopGroupId());
//                        bankTradeDetail.setTopGroupName(bankKey.getTopGroupName());
//
//                        if (bankMap.containsKey(bankTradeDetail.getBankName())){
//                            bankTradeDetail.setBankCode(bankMap.get(bankTradeDetail.getBankName()));
//                            bankTradeDetail.setBankName(bankNameMap.get(bankTradeDetail.getBankName()));
//                        }
//
//                        //1-支出,对方账户
//                        if (Optional.ofNullable(bankTradeDetail.getCdSign()).isPresent() && bankTradeDetail.getCdSign() == 1) {
//                            if (Optional.ofNullable(bankTradeDetail.getOpBankAccountName()).isPresent() && Optional.ofNullable(bankTradeDetail.getOpBankAccount()).isPresent()) {
//                                int length = bankTradeDetail.getOpBankAccountName().length();
//                                int name = bankTradeDetail.getOpBankAccount().length();
//                                boolean flag = bankTradeDetail.getOpBankAccountName().contains("银行");
//                                if (length <= 4 && length > 0 && name > 0 && !flag) {
//                                    bankTradeDetail.setIsPrivateTrade(1);
//                                } else {
//                                    bankTradeDetail.setIsPrivateTrade(0);
//                                }
//                            } else {
//                                bankTradeDetail.setIsPrivateTrade(0);
//                            }
//                        }
//
//                        BankTradeDetail old = bankTradeDetailService.getOne(new QueryWrapper<BankTradeDetail>()
//                                .eq("bank_account", bankTradeDetail.getBankAccount())
//                                .eq("serial_no", bankTradeDetail.getSerialNo()));
//                        if (Optional.ofNullable(old).isPresent()){
//                            bankTradeDetail.setId(old.getId());
//                        }
//                        bankTradeDetailService.saveOrUpdate(bankTradeDetail);
//                    }
//
//                    break;
//                default:
//                    return new R(CustomCode.builder().message("type:" + type + "，为未知类型").code(1999).success(false).build());
//            }
//        }catch (Exception e){
//            log.error("BankController ------->saveBankInfo：" + e);
//            return new R(CustomCode.builder().message("保存失败").code(1999).success(false).build());
//        }
//
//        return new R(CustomCode.builder().message("保存成功").code(2000).success(true).build());
//    }
//
//    private String findBankName(Set<String> bankNameList, String openBankName){
//        for (String str : bankNameList){
//            if (openBankName.contains(str)){
//                return str;
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 校验token 并返回用户名 和id
//     * @param request
//     * @return
//     */
//    @GetMapping(value = "checkToken")
//    @PassToken
//    public ObjResult checkToken(HttpServletRequest request){
//        // 从 http 请求头中取出 token
//        String token = request.getHeader("token");
//        if(Tools.isEmpty(token)){
//            token=request.getParameter("token");
//        }
//        //判断有无Token
//        if(Tools.isEmpty(token)){
//            return new ObjResult(CustomCode.builder().message("token为空").code(1999).success(false).build());
//        }
//        // 获取 token 中的 user id
//        List<String> Audience;
//        try {
//            Audience = JWT.decode(token).getAudience();
//        }catch (JWTDecodeException e){
//            return new ObjResult(CustomCode.builder().message("token无效").code(1999).success(false).build());
//        }
//        if(Audience==null || Audience.size()<=0){
//            return new ObjResult(CustomCode.builder().message("权限不足，无权操作！").code(1999).success(false).build());
//        }
//
//        PageData user;
//        try {
//            String userid=Audience.get(0);
//            user= userDao.findbyid(userid);
//            if (user == null) {
//                return new ObjResult(CustomCode.builder().message("token无效").code(1999).success(false).build());
//            }
//        }catch (Exception e){
//            return new ObjResult(CustomCode.builder().message("token无效").code(1999).success(false).build());
//        }
//
//        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getString("password"))).build();
//        try {
//            jwtVerifier.verify(token);
//        } catch (JWTVerificationException e) {
//            return new ObjResult(CustomCode.builder().message("token无效").code(1999).success(false).build());
//        }
//
//        ObjResult obj = new ObjResult(CommonCode.SUCCESS);
//        PageData pd = new PageData();
//        pd.put("name",user.getString("name"));
//        pd.put("loginNum",user.getString("username"));
//        pd.put("id",user.getString("id"));
//        obj.setPageData(pd);
//        return obj;
//    }
//
//    private Map<String, Map<String, String>> initRef(){
//        Map<String, Map<String, String>> refs = new HashMap<>();
//        Map<String, String> currentRef = new HashMap<>(16);
//
//        /**
//         * 人民币
//         */
//        currentRef.put("RMB", "014001");
//
//        /**
//         * 港币
//         */
//        currentRef.put("HKD", "014012");
//
//        /**
//         * 马来西亚林吉特
//         */
//        currentRef.put("MYR", "014023");
//
//        /**
//         * 新西兰元
//         */
//        currentRef.put("NZD", "014026");
//
//        /**
//         * 澳元
//         */
//        currentRef.put("AUD", "014021");
//
//        /**
//         * 泰国铢
//         */
//        currentRef.put("THB", "014033");
//
//        /**
//         * 台湾元
//         */
//        currentRef.put("TWD", "014035");
//
//        /**
//         * 美元
//         */
//        currentRef.put("USD", "014007");
//
//        /**
//         * 欧元
//         */
//        currentRef.put("EUR", "014010");
//
//        /**
//         * 加拿大元
//         */
//        currentRef.put("CAD", "014005");
//
//        /**
//         * 英镑
//         */
//        currentRef.put("GBP", "014011");
//
//        /**
//         * 日元
//         */
//        currentRef.put("JPY", "014017");
//
//        /**
//         * 新加坡元
//         */
//        currentRef.put("SGD", "014032");
//
//        /**
//         * 瑞士法朗
//         */
//        currentRef.put("CHF", "014006");
//
//        /**
//         * 瑞典克朗
//         */
//        currentRef.put("SEK", "014031");
//
//        refs.put("currentRef", currentRef);
//
//        List<PageData> allOrg = (List<PageData>)orgzationService.listAll().getPageData().get("list");
//        Map<String, String> orgIdNameMap = new HashMap<>();
//        Map<String, String> orgNameIdMap = new HashMap<>();
//        Map<String, String> orgNameCodeMap = new HashMap<>();
//        Map<String, String> orgCodeIdMap = new HashMap<>();
//        if (CollectionUtil.isNotEmpty(allOrg)){
//            for (PageData org : allOrg){
//                orgIdNameMap.put((String)org.get("id"), (String)org.get("orgName"));
//                orgNameIdMap.put((String)org.get("orgName"), (String)org.get("id"));
//                orgNameCodeMap.put((String)org.get("orgName"), (String)org.get("orgCode"));
//                orgCodeIdMap.put((String)org.get("orgCode"), (String)org.get("id"));
//            }
//        }
//        refs.put("orgIdNameMap", orgIdNameMap);
//        refs.put("orgNameIdMap", orgNameIdMap);
//        refs.put("orgNameCodeMap", orgNameCodeMap);
//        refs.put("orgCodeIdMap", orgCodeIdMap);
//
//        try {
//            List<Tree> trees = baseInfoService.findThisChi(ValueSetConstant.BANK);
//            Map<String, String> bankMap = new HashMap<>();
//            Map<String, String> bankNameMap = new HashMap<>();
//            Map<String, String> bankNameCodeMap = new HashMap<>();
//            if (CollectionUtil.isNotEmpty(trees)){
//                for (Tree bank : trees){
//                    bankMap.put(bank.getValIndustryCode(), bank.getCode());
//                    bankNameMap.put(bank.getValIndustryCode(), bank.getName());
//                    bankNameCodeMap.put(bank.getName(), bank.getCode());
//                }
//            }
//            refs.put("bankMap", bankMap);
//            refs.put("bankNameMap", bankNameMap);
//            refs.put("bankNameCodeMap", bankNameCodeMap);
//
//        }catch (Exception e){
//            log.error("银行值级获取失败------>", e);
//        }
//        return refs;
//    }
//
//
//}
